Syntax10.Scn.Fnt Syntax10b.Scn.Fnt MODULE AmigaDiskFont; IMPORT SYSTEM, A := AmigaBase, e := AmigaExec, g := AmigaGraphics; CONST diskFontName*="diskfont.library"; maxFontPath * = 256; (* including null terminator *) FontContentsPtr * = UNTRACED POINTER TO FontContents; FontContents * = STRUCT fileName * : ARRAY maxFontPath OF CHAR; ySize * : INTEGER; style * : SHORTSET; flags * : SHORTSET; END; TFontContentsPtr * = UNTRACED POINTER TO TFontContents; TFontContents * = STRUCT fileName * : ARRAY maxFontPath-2 OF CHAR; tagCount * : INTEGER; (* * if tfc_TagCount is non-zero, tfc_FileName is overlayed with * Text Tags starting at: (struct TagItem * ) * &tfc_FileName[MAXFONTPATH-(tfc_TagCount*sizeof(struct TagItem))] *) ySize * : INTEGER; style * : SHORTSET; flags * : SHORTSET; END; CONST fchId * = 00F00H; (* FontContentsHeader, then FontContents *) tfchId * = 00F02H; (* FontContentsHeader, then TFontContents *) FontContentsHeaderPtr * = UNTRACED POINTER TO FontContentsHeader; FontContentsHeader * = STRUCT fileID * : INTEGER; (* FCH_ID *) numEntries * : INTEGER; (* the number of FontContents elements *) (* fc * : ARRAY numEntries OF FontContents or tfc * : ARRAY numEntries OF TFontContents *) END; CONST dfhId * = 00F80H; maxFontName * = 32; (* font name including ".font\0" *) DiskFontHeaderPtr * = UNTRACED POINTER TO DiskFontHeader; DiskFontHeader * = STRUCT (df * : e.Node) (* node to link disk fonts *) (* the following 8 bytes are not actually considered a part of the *) (* DiskFontHeader, but immediately preceed it. The NextSegment is *) (* supplied by the linker/loader, and the ReturnCode is the code *) (* at the beginning of the font in case someone runs it... *) (* ULONG dfh_NextSegment; \* actually a BPTR *) (* ULONG dfh_ReturnCode; \* MOVEQ #0,D0 : RTS *) (* here then is the official start of the DiskFontHeader... *) fileID * : INTEGER; (* DFH_ID *) revision * : INTEGER; (* the font revision *) segment * : e.BPTR; (* the segment address when loaded *) name * : ARRAY maxFontName OF CHAR; (* the font name (null terminated) *) tf * : g.TextFont; (* loaded TextFont structure *) END; CONST memory * = 0; disk * = 1; scaled * = 2; tagged * = 16; (* return TAvailFont *) AvailFontPtr * = UNTRACED POINTER TO AvailFont; AvailFont * = STRUCT type * : SET; (* MEMORY, DISK, or SCALED *) attr * : g.TextAttr; (* text attributes for font *) END; TAvailFontPtr * = UNTRACED POINTER TO TAvailFont; TAvailFont * = STRUCT type * : SET; (* MEMORY, DISK, or SCALED *) attr * : g.TTextAttr; (* text attributes for font *) END; AvailFontsHeaderPtr * = UNTRACED POINTER TO AvailFontsHeader; AvailFontsHeader * = STRUCT numEntries * : INTEGER; (* number of AvailFont elements *) (* af * : ARRAY numEntries OF AvailFont or taf * : ARRAY numEntries OF TAvailFont *) END; diskFontBase*: e.LibraryPtr; diskFontVersion-:INTEGER; PROCEDURE OpenDiskFont*(VAR textAttr: g.TextAttr): g.TextFontPtr; r:A.Regs; BEGIN r.a[0] := SYSTEM.ADR(textAttr); A.LibCall(diskFontBase,-30,r); RETURN SYSTEM.VAL(g.TextFontPtr, r.d[0]) END OpenDiskFont; PROCEDURE Init; LibraryPtr=POINTER TO e.Library; lib:LibraryPtr; BEGIN diskFontBase := e.OpenLibrary(diskFontName,37); IF diskFontBase=0 THEN HALT(99) END; lib:=SYSTEM.VAL(LibraryPtr,diskFontBase); diskFontVersion:=lib.version; END Init; BEGIN Init END AmigaDiskFont.